package vip.george.common.dto;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import vip.george.common.constant.ResultCodeEnum;
import vip.george.common.exception.AppException;

/**
 * @author george
 * @since 2023/7/5
 * <p>通用返回dto实体</p>
 */
@Data
public class ResultVO<T> {

    private String responseCode;

    private String responseMessage;

    private T data;


    /**
     * 构造器私有化，避免外部直接通过new关键字创建对象
     * @param code
     * @param message
     * @param data
     */
    private ResultVO(String code, String message, T data) {
        this.responseCode = code;
        this.responseMessage = message;
        this.data = data;

    }


    /**
     * 接口响应成功的响应码只有200
     * @param data
     * @return
     * @param <T>
     */
    public static <T> ResultVO<T> success(T data) {
        return new ResultVO<>(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(),data);
    }

    /**
     * 错误响应(一旦有错误时，响应的data为null)
     * @param code
     * @param message
     * @return
     * @param <T>
     */
    public static <T> ResultVO<T> error(String code, String message) {
        return new ResultVO<>(code, message,null);
    }


    /**
     * 错误响应
     * @param message
     * @return
     * @param <T>
     */
    public static <T> ResultVO<T> error(String message) {
        return new ResultVO<>("500", message,null);
    }

    /**
     * 错误响应
     * @param resultCodeEnum
     * @return
     * @param <T>
     */
    public static <T> ResultVO<T> error(ResultCodeEnum resultCodeEnum) {
        return error(resultCodeEnum.getCode(), resultCodeEnum.getMessage());
    }



    /**
     * 获取data数据并且检查是否响应成功
     * 在服务间远程调用获取数据时使用
     *
     * 特别注意：
     *      因为jackson序列化的时候默认会将所有以get开头的方法序列化。
     *      里这个方法必须加@JsonIgnore注解，否则该方法会被自动调用
     *
     * @return
     */
    @JsonIgnore
    public T getDataAndCheckSuccess(){
        // 如果响应码非200则远程调用时发生异常
        if (!"200".equals(responseCode)){
            throw new AppException(ResultCodeEnum.FEIGN_ERROR);
        }
        return data;
    }
}
